<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>

<script>
/******************************************
**	队列遵循先进先出（FIFO）原则，是有序集合
**	最常见的列子是排队
**	这里举得列子是循环队列中的
**	列子：
**	有n个人围成一圈，顺序排号。
**	从第一个人开始报数（从1到3报数），
**	凡报到3的人退出圈子，
**	问最后留下的是原来第几号的那位。
******************************************/


//	创建队列类
function Queue(){
	var items = [];
	
	//	向队列末尾添加元素，返回添加的元素
	this.enqueue = function(element){
		return items.push(element);
	}
	
	//	移除队列首位元素，返回移出的元素
	this.dequeue = function(){
		return items.shift();
	}
	
	//	返回队列的长度
	this.size = function(){
		return items.length;
	}
	
	//	查看队列首位元素，不对队列做任何操作
	this.front = function(){
		return items[0];
	}
	
	//	判断队列是否为空，为空返回true
	this.isEmpty = function(){
		return items.length==0;
	}
	
	//	清空队列
	this.clear = function(){
		items = [];
	}
	
	//	输出队列中所有的元素
	this.println = function(){
		console.log(items.toString()); 
	}
}


//	击鼓传花
function jgchh(people_num, n){
	var queue = new Queue();
	
	//	为队列赋值
	for (var i=1; i<=people_num; i++){
		queue.enqueue(i);
	}
	
    //  当剩余的人数超过1时执行
	while (queue.size() > 1){
		//  使用循环队列
		for (var i=1; i<n; i++){
			//  报数没报到n时，当前值移动到队列末尾
			queue.enqueue(queue.dequeue());
		}
		//  移除报数报到n的人
		queue.dequeue();		
	}
	//	输出最后胜利的人
	queue.println();
}
jgchh(10,3);

</script>
</head>

